package com.qf.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**
 * @author 10537
 * @version V1.0
 * @Date 2021/9/28 15:50
 */

public class WriteLogAdvice {
    public void writeLog() {
        System.out.println("输出日志");
    }

    /**
     * @param jp     连接点
     * @param result 返回值
     */
    public void afterReturning(JoinPoint jp, Object result) {
        //获得代理对象
        Object target = jp.getTarget();
        //获得被代理方法的参数
        Object[] args = jp.getArgs();
        //获取被代理方法的名字
        String name = jp.getSignature().getName();

        System.out.println("被代理的对象为" + target);
        System.out.println("被代理方法参数" + Arrays.toString(args));
        System.out.println("被代理的方法的名字" + name);

        System.out.println("执行了后置增强方法------返回结果为：" + result);
    }

    /**
     * 异常增强
     * @param e
     */
    public void afterThrowing(Throwable e) {
        System.out.println("执行了异常增强--------抛出的异常为：" + e.getMessage());
    }

    /**
     * 最终增强
     */
    public void after() {
        System.out.println("执行了最终增强------执行了finally代码块");
    }


    //环绕增强
    private Object around(ProceedingJoinPoint pjp){
        Object result=null;
        try {
            System.out.println("环绕增强--前值增强");

            //执行被代理类的原方法，不写不执行原方法
            result=pjp.proceed(pjp.getArgs());
            System.out.println("环绕增强--后置增强");
        }catch (Throwable throwable) {
            System.out.println("环绕增强--异常增强");
            throwable.printStackTrace();
        } finally {
            System.out.println("环绕增强--最终增强");
        }
        return result;
    }
}
